package ofertas;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.junit.Before;
import org.junit.Test;

import productosYPresentaciones.Producto;

/**
 * Test de la clase de oferta que esta constituida por un solo producto.
 * @author Octavio.
 */

public class OfertaUnSoloProductoTest extends OfertaTest{

	@Override
	@Before
	public void setUp() throws Exception {
		super.setUp();
		oferta = new OfertaUnSoloProducto(porc,producto1);
	}

	@Test
	public void testPrecioOferta() {
		assertEquals( producto1.precioActual()*(1-porc), oferta.precioOferta() , 0.002 );
	}

	@Test
	public void testGetListaProductos() {
		List<Producto> lista = new ArrayList<Producto>();
		lista.add( producto1 );
		assertEquals( lista, oferta.getListaProductos() );
	}
	
	@Test
	public void testGetProductos() {
		Map<Producto,Integer> mapa = oferta.getProductos();
		assertEquals( 1, mapa.size() );
		assertTrue( mapa.containsKey(producto1) );
		assertEquals( 1, mapa.get(producto1).intValue() );
	}

	@Test
	public void testHayOfertasConProductos() {
		//Creo un map, que esencialmente tiene el mismo contenido
		//que la lista lfake:producto1
		Map<Producto,Integer> mfake = mock( Map.class );
		
		//Declaro las condiciones iniciales
		when(mfake.containsKey(producto1)).thenReturn(true);
		when(mfake.get(producto1)).thenReturn(1);
		//Compruebo que se aplica la oferta
		assertTrue( oferta.puedeAplicarOferta(mfake) );
		//Y que tampoco necesita saber el estado de productos desconocidos
		verify(mfake,times(0)).containsKey(producto2);
		verify(mfake,times(0)).containsKey(producto3);

		//Sacar otro elemento no afectara,ya que comprobe que
		//no pregunta por los demas elementos
		
		//Remuevo el otro elemento
		when(mfake.containsKey(producto1)).thenReturn(false);
		assertFalse( oferta.puedeAplicarOferta(mfake) );
	}

}
